package com.zenithmind.common.annotation;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * 数据缓存注解
 * 用于简化缓存操作，自动处理缓存击穿、缓存穿透等问题
 * 使用方式：在需要缓存的方法上添加@DataCache注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataCache {

    /**
     * 缓存键前缀
     * 默认使用类名+方法名
     */
    String prefix() default "";

    /**
     * 缓存键，支持SpEL表达式
     * 例如：#user.id 表示取参数中user对象的id属性值
     * 如果不指定，默认使用方法所有参数值的组合
     */
    String key() default "";

    /**
     * 过期时间
     * 默认1小时
     */
    long expireTime() default 3600L;

    /**
     * 时间单位
     * 默认秒
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * 是否启用布隆过滤器防止缓存穿透
     * 默认开启
     */
    boolean useBloomFilter() default true;

    /**
     * 布隆过滤器名称
     * 默认使用缓存键前缀
     */
    String bloomFilterName() default "";

    /**
     * 是否启用分布式锁防止缓存击穿
     * 默认开启
     */
    boolean useLock() default true;

    /**
     * 分布式锁键前缀
     * 默认为"lock:"+prefix
     */
    String lockPrefix() default "";

    /**
     * 是否缓存空值
     * 默认开启，防止缓存穿透
     */
    boolean cacheNull() default true;

    /**
     * 空值缓存过期时间（秒）
     * 默认10分钟
     */
    long nullValueExpireTime() default 600L;
} 